#pragma once
/* =================================================================================
 *  二次封装 spdlog
 *    1. 避免单例的锁冲突, 直接创建全局、线程安全的日志器进行使用
 *    2. spdlog没有文件名行号，自行封装
 *    3. 封装一个初始化接口，便于开发和发布灵活配置使用(调试模式标准输出，发布则文件输出)
* ================================================================================== */

#include <spdlog/common.h>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>   
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <iostream>

namespace shared {

// [mode] 运行模式: true-发布模式 false调试模式
std::shared_ptr<spdlog::logger> g_default_logger;
void init_logger(bool mode, const std::string& file, int32_t level)
{
    if(mode) {
        g_default_logger = spdlog::basic_logger_mt("default-logger", file);
        g_default_logger->set_level(static_cast<spdlog::level::level_enum>(level));
        g_default_logger->flush_on(static_cast<spdlog::level::level_enum>(level));
    } else {
        // 调试模式, 标准输出日志器，最低输出等级
        g_default_logger = spdlog::stdout_color_mt("default-logger");
        g_default_logger->set_level(spdlog::level::level_enum::trace);
        g_default_logger->flush_on(spdlog::level::level_enum::trace);
    }
    g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l] %v");
}

}

#define LOG_TRACE(format, ...) shared::g_default_logger->trace(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) shared::g_default_logger->debug(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_INFO(format, ...) shared::g_default_logger->info(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_WARN(format, ...) shared::g_default_logger->warn(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) shared::g_default_logger->error(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) shared::g_default_logger->critical(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
